﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using OPTFleet.OPTFleet;
using System.Data.Common;
using System.Data.SqlClient;
using System.Data;

namespace OPTFleet.Data
{
    class GestaoEncomendas
    {
        private static String tabelaEncomendas = "encomendas";
        private static String[] chavesEncomendas = { "idencomenda" };
        private static String[] camposEncomendas = { "largura", "comprimento", "altura", "idcliente", "datapedido", "processada" };

        private static String tabelaProdutosEncomendas = "produtosencomendas";
        private static String[] chavesProdutosEncomendas = { "idencomenda", "tipoproduto" };
        private static String[] camposProdutosEncomendas = { "quantidadeproduto" };

        private static String tabelaProdutos = "produtos";
        private static String[] chavesProdutos = { "tipoproduto" };
        private static String[] camposProdutos = { "descricao" };

        private Conexao sqlConnection;
        private GestaoClientes gestaoClientes;

        public Conexao SqlConnection
        {
            set { sqlConnection = value; }
        }

        public GestaoEncomendas(GestaoClientes gestaoClientes)
        {
            this.sqlConnection = new Conexao();
            this.sqlConnection.connect();
            this.gestaoClientes = gestaoClientes;
        }

        public Encomenda ConsultarEncomenda(int idEncomenda) {
            Encomenda encomenda;
            SqlConnection sqlCon;
            SqlCommand sqlCmd;
            String[] parameters = new String[20];
            String stmtSql;
            SqlDataReader rs;

            //sqlCon = (SqlConnection)sqlConnection.Connection;
            sqlCon = new SqlConnection(sqlConnection.Connection.ConnectionString);
            sqlCon.Open();

            parameters[0] = tabelaEncomendas + "." + chavesEncomendas[0];
            parameters[1] = tabelaProdutosEncomendas + "." + camposProdutosEncomendas[0];
            parameters[2] = tabelaProdutos + "." + camposProdutos[0];
            parameters[3] = tabelaEncomendas + "." + camposEncomendas[0];
            parameters[4] = tabelaEncomendas + "." + camposEncomendas[1];
            parameters[5] = tabelaEncomendas + "." + camposEncomendas[2];
            parameters[6] = tabelaEncomendas + "." + camposEncomendas[3];
            parameters[7] = tabelaEncomendas + "." + camposEncomendas[4];
            parameters[8] = tabelaEncomendas;
            parameters[9] = tabelaProdutosEncomendas;
            parameters[10] = tabelaProdutos;
            parameters[11] = tabelaEncomendas + "." + chavesEncomendas[0];
            parameters[12] = tabelaEncomendas + "." + camposEncomendas[5];
            parameters[13] = tabelaEncomendas + "." + chavesEncomendas[0];
            parameters[14] = tabelaProdutosEncomendas + "." + chavesProdutosEncomendas[0];
            parameters[15] = tabelaProdutosEncomendas + "." + chavesProdutosEncomendas[1];
            parameters[16] = tabelaProdutos + "." + chavesProdutos[0];

            /*
            SELECT idencomenda,quantidadeproduto,descricao,largura,comprimento,altura,idcliente,datapedido 
            FROM encomendas,produtosencomendas,produtos 
            WHERE (encomendas.idencomenda=idencomenda) AND (encomendas.processada IS NULL) AND 
            *      encomendas.idencomenda = produtosencomendas.idencomenda AND
            *      produtosencomendas.tipoproduto = produtos.tipoporduto
            */
            stmtSql = "SELECT encomendas.idencomenda,quantidadeproduto,descricao,largura,comprimento,altura,idcliente,datapedido FROM encomendas,produtosencomendas,produtos WHERE (encomendas.idencomenda=@IDEncomenda) AND encomendas.idencomenda = produtosencomendas.idencomenda AND produtosencomendas.tipoproduto = produtos.tipoproduto";
            //stmtSql = string.Format("SELECT {0},{1},{2},{3},{4},{5},{6},{7} FROM {8},{9},{10} WHERE ({11} = @IDEncomenda) AND ({12} IS NULL) AND ({13} = {14}) AND ({15} = {16})", parameters);
           
            sqlCmd = new SqlCommand(stmtSql, sqlCon);

            sqlCmd.Parameters.Add("@IDEncomenda", SqlDbType.Int);
            sqlCmd.Parameters["@IDEncomenda"].Value = idEncomenda;

            rs = sqlCmd.ExecuteReader();

            Console.WriteLine("IDENCOMENDA: " + idEncomenda);
            encomenda = MapEncomenda(rs);

            sqlCon.Close();

            return encomenda;
        }

        private Encomenda MapEncomenda(DbDataReader rs)
        {
            Encomenda e = null;
            SqlDataReader sdr = (SqlDataReader) rs;
            SortedDictionary<String,Int32> sd = new SortedDictionary<String,Int32>();
            String s;
            Int32 i;
            int idcliente;

            if (sdr.Read())
            {
                e = new Encomenda();
                e.IDencomenda = (int)sdr[chavesEncomendas[0]];
                s = ((String)sdr[camposProdutos[0]]).Trim();
                i = (Int32)sdr[camposProdutosEncomendas[0]];
                sd.Add(s, i);

                e.Largura = (Double)sdr[camposEncomendas[0]];
                e.Comprimento = (Double)sdr[camposEncomendas[1]];
                e.Altura = (Double)sdr[camposEncomendas[2]];
                idcliente = (int)sdr[camposEncomendas[3]];
                e.Datapedido = (DateTime)sdr[camposEncomendas[4]];
                while (sdr.Read())
                {
                    s = ((String)sdr[camposProdutos[0]]).Trim();
                    i = (Int32)sdr[camposProdutosEncomendas[0]];
                    sd.Add(s, i);
                }
                e.Produtos = sd;

                rs.Close();

                e.Cliente = gestaoClientes.ConsultarCliente(idcliente);
            }

            return e;
        }

        public SortedSet<int> GetListEncomendas()
        {
            SortedSet<int> ss = new SortedSet<int>();
            SqlConnection sqlCon;
            SqlCommand sqlCmd;
            String stmtSql;
            SqlDataReader rs;
            int ide;

            sqlCon = (SqlConnection)sqlConnection.Connection;           

            stmtSql = string.Format("SELECT idencomenda FROM encomendas WHERE processada IS NULL");

            sqlCmd = new SqlCommand(stmtSql, sqlCon);

            rs = sqlCmd.ExecuteReader();

            while (rs.Read())
            {
                ide = (int)rs["idencomenda"];
                ss.Add(ide);
            }

            rs.Close();

            return ss;
        }

        public SortedSet<Encomenda> GetEncomendaOrd(int weekday)
        {
            SortedSet<Encomenda> ss;
            SqlConnection sqlCon;
            SqlCommand sqlCmd;
            String stmtSql;
            SqlDataReader rs;

            sqlCon = (SqlConnection)sqlConnection.Connection;

            stmtSql = string.Format("SELECT idencomenda,encomendas.idcliente,largura,comprimento,altura,datapedido FROM encomendas,clientes WHERE processada IS NULL AND encomendas.idcliente = clientes.idcliente AND abertura <= @Weekday AND fecho >= @Weekday");

            sqlCmd = new SqlCommand(stmtSql, sqlCon);
            sqlCmd.Parameters.Add("@Weekday", SqlDbType.Int);
            sqlCmd.Parameters["@Weekday"].Value = weekday;

            rs = sqlCmd.ExecuteReader();

            ss = OrdenaEncomendas(rs);

            rs.Close();

            return ss;
        }

        public SortedSet<Encomenda> OrdenaEncomendas(DbDataReader rs)
        {
            SortedSet<Encomenda> ss = new SortedSet<Encomenda>(new Encomenda.OrdenarPorPrioridade());
            SqlDataReader sdr = (SqlDataReader)rs;
            Encomenda e = null;
            int idcliente;

            while (sdr.Read())
            {
                e = new Encomenda();
                e.IDencomenda = (int)sdr[chavesEncomendas[0]];
                e.Produtos = GetProdutos(e.IDencomenda);
                e.Largura = (Double)sdr[camposEncomendas[0]];
                e.Comprimento = (Double)sdr[camposEncomendas[1]];
                e.Altura = (Double)sdr[camposEncomendas[2]];
                idcliente = (int)sdr[camposEncomendas[3]];
                e.Datapedido = (DateTime)sdr[camposEncomendas[4]];
                e.Cliente = gestaoClientes.ConsultarCliente(idcliente);
                e.Processada = DateTime.MinValue;

                ss.Add(e);
            }

            rs.Close();

            return ss;
        }

        public SortedDictionary<String, Int32> GetProdutos(int idEncomenda)
        {
            SortedDictionary<String, Int32> aux = new SortedDictionary<String, Int32>();

            SqlConnection sqlCon;
            SqlCommand sqlCmd;
            String stmtSql;
            SqlDataReader rs;
            String s;
            Int32 i;
            Conexao novaConexao = new Conexao();

            novaConexao.connect();
            sqlCon = (SqlConnection)novaConexao.Connection;

            stmtSql = string.Format("SELECT quantidadeproduto,descricao FROM encomendas,produtosencomendas,produtos WHERE encomendas.idencomenda = @IDEncomenda AND encomendas.idencomenda = produtosencomendas.idencomenda AND produtosencomendas.tipoproduto = produtos.tipoproduto");

            sqlCmd = new SqlCommand(stmtSql, sqlCon);

            sqlCmd.Parameters.Add("@IDEncomenda", SqlDbType.Int);
            sqlCmd.Parameters["@IDEncomenda"].Value = idEncomenda;

            rs = sqlCmd.ExecuteReader();

            while (rs.Read())
            {
                s = ((String)rs["descricao"]).Trim();
                i = (Int32)rs["quantidadeproduto"];
                aux.Add(s, i);
            }

            rs.Close();
            novaConexao.disconnect();

            return aux;
        }
    }
}
